﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Data;
using System.Reflection;
using KPWeb.Class;


namespace KPWeb.Data
{
    public class cMoje : KPPage
    {
 
        public static IEnumerable<vLex_TypDokumentu> GetListaTypWyjscia()
        {
            using (DBContainer db = new DBContainer())
            {
                return (db.vLex_TypDokumentu.Where(a=>a.GrupaDokumentow==1).OrderBy(a=>a.KodDokumentu).ToArray());
            }
        }
        public static IEnumerable<vLex_TypDokumentu> GetListaTypWyjsciaWybierz(int typID)
        {
            using (DBContainer db = new DBContainer())
            {
                return (db.vLex_TypDokumentu.Where(a=>a.TypDokumentuID==typID).ToArray());
            }
        }
        public static IEnumerable<vLex_TypDokumentu> GetListaTypWyjsciaWybierzPrywatne()
        {
            using (DBContainer db = new DBContainer())
            {
                return (db.vLex_TypDokumentu.Where(a => a.TypDokumentuID == 6 || a.TypDokumentuID == 8).OrderBy(a => a.NazwaDokumentu).ToArray());
            }
        }
        public static IEnumerable<vKP_TypLunch> GetListaTypLunch(int jednostkaID)
        {
            using (DBContainer db = new DBContainer())
            {
                int jednostkaGlownaID = Model.GetJednostkaGlownaDlaJednostki(jednostkaID);
                return (db.vKP_TypLunch.Where(a => a.JednostkaGlownaID == jednostkaGlownaID).ToArray());
            }
        }

        public static int InsertUpdateLunch(string menu, int jednostkaID, int osobaID)

                   //1 błąd zapisu
        {
            using (DBContainer db = new DBContainer())
            {
                int jednostkaGlownaID = Model.GetJednostkaGlownaDlaJednostki(jednostkaID);
                try
                {

                    var wiz = db.KP_TypLunch.Where(a => a.JednostkaGlownaId == jednostkaGlownaID && a.active == "t").ToArray();
                    foreach (KP_TypLunch itemp in wiz)
                    {
                        itemp.active = "f";

                        db.SaveChanges();
                    }

                    //  List<string> lMenu = new List<string>();
                    string[] lMenu = menu.Split('#');
                    if (lMenu.Count() == 1 && lMenu[0].Trim() == "") return 0;
                    foreach (string s in lMenu)
                    {
                        if (s.Trim() != "")
                        {
                            KP_TypLunch n = new KP_TypLunch();
                            n.NazwaLunch = s;
                            n.OsobaID = osobaID;
                            n.active = "t";
                            n.JednostkaGlownaId = jednostkaGlownaID;
                            db.KP_TypLunch.AddObject(n);
                            db.SaveChanges();
                        }
                    }

                    return 0;
                }
                catch (Exception e)
                {
                    return 1;
                }


            }
        }
        public static int LunchJestZamowienie(int jednostkaID)

           //1 błąd zapisu
        {
            DateTime dt1 = DateTime.Now.Date;
            DateTime dt2 = dt1.AddDays(1).Date;
            using (DBContainer db = new DBContainer())

            {
                int jednostkaGlownaID = Model.GetJednostkaGlownaDlaJednostki(jednostkaID);
                return (db.vKP_WybierzLunch.Where(a => a.JednostkaGlownaID == jednostkaGlownaID &&
                    a.DataLunch >= dt1 && a.DataLunch < dt2 && a.anulowano=="").Count());
            }

        }
        public static int InsertUpdateWybierzLunch(string[] wybierzLunch, int osobaID, string uwagi)
    
          //1 błąd zapisu
        {
            DateTime dt1 = DateTime.Now.Date;
            DateTime dt2 = dt1.AddDays(1).Date;
       using (DBContainer db = new DBContainer())
            {

                try
                {

                    var wiz = db.KP_WybierzLunch.Where(a => a.OsobaID == osobaID && 
                        a.DataLunch >= dt1 && a.DataLunch < dt2
                         //dt.CompareTo(a.DataLunch) <0
                        && a.active == "t").ToArray();

                    foreach (KP_WybierzLunch itemp in wiz)
                    {
                        itemp.active = "f";

                        db.SaveChanges();
                    }
                    foreach (string s in wybierzLunch)
                    {
                        if (s!=null && s.Trim() != "")
                        {
                            KP_WybierzLunch n = new KP_WybierzLunch();
                            n.TypLunchID = int.Parse(s);
                            n.OsobaID = osobaID;
                            n.DataLunch = DateTime.Now;
                            n.active = "t";
                            n.Uwagi = uwagi;
                            db.KP_WybierzLunch.AddObject(n);
                            db.SaveChanges();
                        }
                    }

                    return 0;
                }
                catch (Exception e)
                {
                    return 1;
                }


            }
        }
        public static int AnulujLunch( int osobaID, string uwagi)

          //1 błąd zapisu
        {
            DateTime dt1 = DateTime.Now.Date;
            DateTime dt2 = dt1.AddDays(1).Date;
            using (DBContainer db = new DBContainer())
            {

                try
                {

                    var wiz = db.KP_WybierzLunch.Where(a => a.OsobaID == osobaID &&
                     a.DataLunch >= dt1 && a.DataLunch < dt2
                        && a.active == "t").ToArray();

                    foreach (KP_WybierzLunch itemp in wiz)
                    {
                        itemp.active = "f";
                        itemp.DataLunch = DateTime.Now;
                        itemp.Uwagi += ("; " + uwagi);
                        db.SaveChanges();
                    }
   

                    return 0;
                }
                catch (Exception e)
                {
                    return 1;
                }


            }
        }
        public static vKP_WyjsciaOdpracowaniaNadgodziny[] GetWyjsciaOdpracowaniaNadgodzinyWspolneOkresy(int osobaID)
        {
            using (DBContainer db = new DBContainer())
            {
           
                    return (from wiz in db.vKP_WyjsciaOdpracowaniaNadgodziny.Where(a => a.OsobaID == osobaID)
                            select wiz).ToArray();
           
            }
        }

        public static vKP_WyjsciaOdpracowaniaNadgodziny[] GetWyjsciaOdpracowaniaNadgodziny(int osobaID, int year, int typWyjsciaID)
        {
            using (DBContainer db = new DBContainer())
            {
                if (typWyjsciaID == 0)
                      return (from wiz in db.vKP_WyjsciaOdpracowaniaNadgodziny.Where(a => a.OsobaID == osobaID &&
                         a.OdData.Year==year).OrderByDescending(a=>a.OdData)
                                select wiz).ToArray();
                else
                    return (from wiz in db.vKP_WyjsciaOdpracowaniaNadgodziny.Where(a => a.OsobaID == osobaID &&
                                           a.OdData.Year == year && a.TypWyjsciaID == typWyjsciaID).OrderByDescending(a => a.OdData)
                            select wiz).ToArray();

            }
        }

        public static vKP_WyjsciaOdpracowaniaNadgodziny[] GetWyjsciaOdpracowaniaNadgodzinyPrywatne(int osobaID,  int typWyjsciaID)
        {
            using (DBContainer db = new DBContainer())
            {
                if (typWyjsciaID == 0)
                    return (from wiz in db.vKP_WyjsciaOdpracowaniaNadgodziny.Where(a => a.OsobaID == osobaID &&
                       (a.TypWyjsciaID == 6 || a.TypWyjsciaID == 8) && a.Stan>0).OrderByDescending(a => a.OdData)
                            select wiz).ToArray();
                    if (typWyjsciaID==-1)
                        return (from wiz in db.vKP_WyjsciaOdpracowaniaNadgodziny.Where(a => a.OsobaID == osobaID &&
                                              (a.TypWyjsciaID == 10 || a.TypWyjsciaID == 11) && a.Stan > 0).OrderByDescending(a => a.OdData)
                                select wiz).ToArray();
                else
                    return (from wiz in db.vKP_WyjsciaOdpracowaniaNadgodziny.Where(a => a.OsobaID == osobaID &&
                                          a.TypWyjsciaID == typWyjsciaID && a.Stan > 0).OrderByDescending(a => a.OdData)
                            select wiz).ToArray();

            }
        }
        public static vKP_WyjsciaOdpracowaniaNadgodzinyJednostka[] GetWyjsciaOdpracowaniaNadgodzinyJednostka(int jednostkaGlownaID, int osobaID, int year, int typWyjsciaID)
        {
            using (DBContainer db = new DBContainer())
            {
                if (osobaID == 0)
                {
                    if (typWyjsciaID == 0)
                        return (from wiz in db.vKP_WyjsciaOdpracowaniaNadgodzinyJednostka.Where(a => a.JednostkaGlownaID == jednostkaGlownaID && a.OdData.Year == year).OrderByDescending(a => a.OdData)
                                select wiz).ToArray();
                    else
                        return (from wiz in db.vKP_WyjsciaOdpracowaniaNadgodzinyJednostka.Where(a =>  a.JednostkaGlownaID == jednostkaGlownaID &&
                                              a.TypWyjsciaID == typWyjsciaID && a.OdData.Year == year).OrderByDescending(a => a.OdData)
                                select wiz).ToArray();
                }
                else
                {
                    if (typWyjsciaID == 0)
                        return (from wiz in db.vKP_WyjsciaOdpracowaniaNadgodzinyJednostka.Where(a => a.OsobaID == osobaID && a.JednostkaGlownaID == jednostkaGlownaID &&
                            a.OdData.Year == year).OrderByDescending(a => a.OdData)
                                select wiz).ToArray();
                    else
                        return (from wiz in db.vKP_WyjsciaOdpracowaniaNadgodzinyJednostka.Where(a => a.OsobaID == osobaID && a.JednostkaGlownaID == jednostkaGlownaID &&
                                              a.TypWyjsciaID == typWyjsciaID && a.OdData.Year == year).OrderByDescending(a => a.OdData)
                                select wiz).ToArray();
                }
            }
        }

        public static vKP_WyjsciaOdpracowaniaNadgodzinyOsoby[] GetWyjsciaOdpracowaniaNadgodzinyOsoby(int jednostkaGlownaID)
        {
            using (DBContainer db = new DBContainer())
            {

                return (from wiz in db.vKP_WyjsciaOdpracowaniaNadgodzinyOsoby.Where(a => a.JednostkaGlownaID == jednostkaGlownaID)
                            select wiz).Distinct().ToArray();
           
            }
        }
      

        public static int GetSumaWyjsciaPrywatne(int osobaID)
        {
            using (DBContainer db = new DBContainer())
            {
                int s1 = 0;
                if (db.vKP_WyjsciaOdpracowaniaNadgodziny.Where(a => a.OsobaID == osobaID &&
                    a.TypWyjsciaID == 6 && a.Stan > 0).Count() > 0)
                    s1 = db.vKP_WyjsciaOdpracowaniaNadgodziny.Where(a => a.OsobaID == osobaID &&
                                     a.TypWyjsciaID == 6 && a.Stan > 0).Sum(a => a.CzasWMinutach);
                return (s1);
            }
        }

        public static int GetSumaOdpracowaniaPrywatne(int osobaID)
        {
            using (DBContainer db = new DBContainer())
            {
                int s1 = 0;
                if (db.vKP_WyjsciaOdpracowaniaNadgodziny.Where(a => a.OsobaID == osobaID &&
                    a.TypWyjsciaID == 8 && a.Stan > 0).Count() > 0)
                    s1 = db.vKP_WyjsciaOdpracowaniaNadgodziny.Where(a => a.OsobaID == osobaID &&
                                     a.TypWyjsciaID == 8 && a.Stan > 0).Sum(a => a.CzasWMinutach);
                return (s1);
            }
        }


        public static int GetSumaPrywatneRazem(int osobaID)
        {
            using (DBContainer db = new DBContainer())
            {

                return (GetSumaWyjsciaPrywatne(osobaID) - GetSumaOdpracowaniaPrywatne(osobaID));
            }
        }

        public static int GetSumaWykonaniaNadgodziny(int osobaID)
        {
            using (DBContainer db = new DBContainer())
            {
                int s1 = 0;
                if (db.vKP_WyjsciaOdpracowaniaNadgodziny.Where(a => a.OsobaID == osobaID &&
                    a.TypWyjsciaID == 11 && a.Stan > 0).Count() > 0)
                    s1 = db.vKP_WyjsciaOdpracowaniaNadgodziny.Where(a => a.OsobaID == osobaID &&
                                     a.TypWyjsciaID == 11 && a.Stan > 0).Sum(a => a.CzasWMinutach);
                return (s1);
            }
        }

        public static int GetSumaOdbioruNadgodziny(int osobaID)
        {
            using (DBContainer db = new DBContainer())
            {
                int s1 = 0;
                if (db.vKP_WyjsciaOdpracowaniaNadgodziny.Where(a => a.OsobaID == osobaID &&
                    a.TypWyjsciaID == 10 && a.Stan > 0).Count() > 0)
                    s1 = db.vKP_WyjsciaOdpracowaniaNadgodziny.Where(a => a.OsobaID == osobaID &&
                                     a.TypWyjsciaID == 10 && a.Stan > 0).Sum(a => a.CzasWMinutach);
                return (s1);
            }
        }


        public static int GetSumaNadgodzinyRazem(int osobaID)
        {
            using (DBContainer db = new DBContainer())
            {

                return (GetSumaWykonaniaNadgodziny(osobaID) - GetSumaOdbioruNadgodziny(osobaID));
            }
        }  
        
        public static int GetSumaWyjsciaDniWolne(int osobaID)
        {
            using (DBContainer db = new DBContainer())
            {
                int s1 = 0;
                if (db.vKP_DokumentyWnioskiUrlopowe.Where(a => a.OsobaID == osobaID &&
                    a.TypNieobecnosciUrlopuID == 7 && a.stan > 0).Count() > 0)
                    s1 = db.vKP_DokumentyWnioskiUrlopowe.Where(a => a.OsobaID == osobaID &&
                             a.TypNieobecnosciUrlopuID == 7 && a.stan > 0).Sum(a => a.DniRoczych);
                return (480 * s1);// #### poprawic dla niepełnoetatowców
            }
        }

        public static int GetSumaOdpracowaniaDniWolne(int osobaID)
        {
            using (DBContainer db = new DBContainer())
            {
                int s1 = 0;
                if (db.vKP_WyjsciaOdpracowaniaNadgodziny.Where(a => a.OsobaID == osobaID &&
                    a.TypWyjsciaID == 9 && a.Stan > 0).Count() > 0)
                    s1 = db.vKP_WyjsciaOdpracowaniaNadgodziny.Where(a => a.OsobaID == osobaID &&
                                     a.TypWyjsciaID == 9 && a.Stan > 0).Sum(a => a.CzasWMinutach);
                return (s1);
            }
        }


        public static int GetSumaDniWolneRazem(int osobaID)
        {
            using (DBContainer db = new DBContainer())
            {

                return (GetSumaWyjsciaDniWolne(osobaID) - GetSumaOdpracowaniaDniWolne(osobaID));
            }
        }
        public static int InsertWyjsciaOdpracowaniaNadgodziny(int osobaID, byte typWyjsciaID,
            DateTime odData, DateTime doData, DateTime? planowanyPowrot, int czasWMinutach, byte stan, int? OsobaIDSkasowała)
        //-4 pokrywające się czasy w juz utworzonych rekordach 
        //-1 błąd zapisu
        //ID utworzonego rekordu  WyjsciaOdpracowaniaNadgodziny
        {

            foreach (vKP_WyjsciaOdpracowaniaNadgodziny d in GetWyjsciaOdpracowaniaNadgodzinyWspolneOkresy(osobaID))
            {
                if (doData >= d.OdData && doData <= d.DoData ||
                    odData >= d.OdData && odData <= d.DoData ||
                    odData <= d.OdData && doData >= d.DoData)
                {
                    return -4;
                }
            }


            using (DBContainer db = new DBContainer())
            {
                try
                {
                    KP_WyjsciaOdpracowaniaNadgodziny e = new KP_WyjsciaOdpracowaniaNadgodziny();
                    e.OsobaID = osobaID;
                    e.TypWyjsciaID = typWyjsciaID;
                    e.OdData = odData;
                    e.DoData = doData;
                    e.PlanowanyPowrot = planowanyPowrot;
                    e.CzasWMinutach = czasWMinutach;
                    e.Stan = stan;
                    e.DataUtworzenia = DateTime.Now;
                    e.active = "t";
                    e.OsobaIDSkasowała = OsobaIDSkasowała;
                    db.KP_WyjsciaOdpracowaniaNadgodziny.AddObject(e);
                    db.SaveChanges();


                    return e.WyjsciaID;
                }
                catch (Exception e)
                {
                    return -1;
                }

            }
        }

        public static int UpdateWyjsciaDo(int wyjscieID, DateTime tDoData,int czas)

       //1 błąd zapisu
        {

            using (DBContainer db = new DBContainer())
            {

                try
                {

                    var wiz = db.KP_WyjsciaOdpracowaniaNadgodziny.Where(a => a.WyjsciaID == wyjscieID &&
                                            a.active == "t").Single();

                    wiz.DoData = tDoData;
                    wiz.CzasWMinutach = czas;
                  db.SaveChanges();
                  return 0;
            }
                catch (Exception e)
                {
                    return 1;
                }

        }
    }
        public static int UpdateWyjsciaStan(int wyjscieID, byte stan1, byte stan2)

      //1 błąd zapisu
        {

            using (DBContainer db = new DBContainer())
            {

                try
                {

                    var wiz = db.KP_WyjsciaOdpracowaniaNadgodziny.Where(a => a.WyjsciaID == wyjscieID && a.Stan == stan1 &&
                                            a.active == "t").Single();

                    wiz.Stan = stan2;
                    db.SaveChanges();
                    return 0;
                }
                catch (Exception e)
                {
                    return 1;
                }

            }
        }

    
        public int InsertMojaAnkietaOcena(int dokumentID, int osobaID, short rok, int? b1_1, int? b1_2, int? b1_3, int? b1_4)
           {
            System.Data.Common.DbTransaction trans = null;
            using (DBContainer db = new DBContainer())
            {

                try
                {
                    DateTime nowDateTime=DateTime.Now;
                    db.Connection.Open();
                    trans = db.Connection.BeginTransaction();

                   var wiz = db.KP_AnkietyOcena.Where(a => a.DokumentID==dokumentID && a.OsobaID==osobaID && a.TimeUntil==null &&
                                            a.active == "t").ToArray();
                   if (wiz.Count() == 1)
                   {
                       wiz.Single().TimeUntil = nowDateTime;
                       db.SaveChanges();
                   }
                   KP_AnkietyOcena e = new KP_AnkietyOcena();
                   e.DokumentID = dokumentID;

                   e.TimeSince = nowDateTime;
                   e.TimeUntil = null;

                   e.OsobaID = osobaID;
                   e.Rok = rok;

                   e.B1_1 = b1_1;
                   e.B1_2 = b1_2;
                   e.B1_3 = b1_3;
                   e.B1_4 = b1_4;


                    e.Stan = 0;
                    e.active = "t";
                    db.KP_AnkietyOcena.AddObject(e);
                    db.SaveChanges();
                   
                    trans.Commit();
                    return 0;

                }
                catch (Exception ex)
                {
                    if (trans != null)
                        trans.Rollback();
                    return -1;
                }
                finally
                {
                    if (db.Connection.State == ConnectionState.Open)
                        db.Connection.Close();
                }

            }
        }

        public int InsertMojaAnkietaOcenaXML(int dokumentID, int osobaID, short rok, string ankietaOcena)
        {
            System.Data.Common.DbTransaction trans = null;
            using (DBContainer db = new DBContainer())
            {

                try
                {
                    DateTime nowDateTime = DateTime.Now;
                    db.Connection.Open();
                    trans = db.Connection.BeginTransaction();

                    var wiz = db.KP_AnkietyOcenaXML.Where(a => a.DokumentID == dokumentID && a.OsobaID == osobaID && a.TimeUntil == null &&
                                             a.active == "t").ToArray();
                    if (wiz.Count() == 1)
                    {
                        wiz.Single().TimeUntil = nowDateTime;
                        db.SaveChanges();
                    }
                    KP_AnkietyOcenaXML e = new KP_AnkietyOcenaXML();
                    e.DokumentID = dokumentID;

                    e.TimeSince = nowDateTime;
                    e.TimeUntil = null;

                    e.OsobaID = osobaID;
                    e.Rok = rok;

                    e.AnkietaOcenaXML = ankietaOcena;


                    e.Stan = 0;
                    e.active = "t";
                    db.KP_AnkietyOcenaXML.AddObject(e);
                    db.SaveChanges();

                    trans.Commit();
                    return 0;

                }
                catch (Exception ex)
                {
                    if (trans != null)
                        trans.Rollback();
                    return -1;
                }
                finally
                {
                    if (db.Connection.State == ConnectionState.Open)
                        db.Connection.Close();
                }

            }
        }
        public int UpdateAnkietaOcenaStan(int dokumentID, int osobaID, byte stan1, byte stan2, int loginID)
        {

            using (DBContainer db = new DBContainer())
            {
                try
                {
                    var wiz1 = db.KP_AnkietyOcena.Where(a => a.DokumentID == dokumentID && a.OsobaID == osobaID && a.TimeUntil == null &&
                                            a.active == "t" && a.Stan==stan1).ToArray();
                    if (wiz1.Count()== 0)
                    {
                        return -2;
                    }
                    var wiz = db.KP_AnkietyOcena.Where(a => a.DokumentID == dokumentID && a.OsobaID == osobaID && a.TimeUntil == null &&
                                            a.active == "t" && a.Stan == stan1).Single();
                    wiz.TimeSince = DateTime.Now; 
                    wiz.Stan = stan2;
                    wiz.OsobaID = loginID;
                    db.SaveChanges();
                    return 0;


                }
                catch (Exception e)
                {
                    return -1;
                }

            }
        }
     
    }
}